From 7848a26a9729479720edfcee8c6bd816eb11ac41 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 22 Jan 2010 10:59:51 +0000 Subject: [PATCH] libxc: mmapbatch-v2 adjustments Just like the kernel, the fallback implementation of xc_map_foreign_bulk() should clear the error indication array upon success. Also, a few allocations were needlessly using calloc() instead of malloc(). Finally, in xc_domain_save() allocate the error indicator array once (along with the other arrays) instead of using realloc() (without error checking) in the loop body. Signed-off-by: Jan Beulich --- tools/libxc/xc_domain_save.c | 4 ++-- tools/libxc/xc_linux.c | 2 +- tools/libxc/xc_misc.c | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c index aa9748a7e5..2334b49c07 100644 --- a/tools/libxc/xc_domain_save.c +++ b/tools/libxc/xc_domain_save.c @@ -1059,7 +1059,8 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters, pfn_type = xc_memalign(PAGE_SIZE, ROUNDUP( MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT)); pfn_batch = calloc(MAX_BATCH_SIZE, sizeof(*pfn_batch)); - if ( (pfn_type == NULL) || (pfn_batch == NULL) ) + pfn_err = malloc(MAX_BATCH_SIZE * sizeof(*pfn_err)); + if ( (pfn_type == NULL) || (pfn_batch == NULL) || (pfn_err == NULL) ) { ERROR("failed to alloc memory for pfn_type and/or pfn_batch arrays"); errno = ENOMEM; @@ -1273,7 +1274,6 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters, if ( batch == 0 ) goto skip; /* vanishingly unlikely... */ - pfn_err = realloc(pfn_err, sizeof(int) * batch); region_base = xc_map_foreign_bulk( xc_handle, dom, PROT_READ, pfn_type, pfn_err, batch); if ( region_base == NULL ) diff --git a/tools/libxc/xc_linux.c b/tools/libxc/xc_linux.c index 3f3bc10d95..55ceda1fcd 100644 --- a/tools/libxc/xc_linux.c +++ b/tools/libxc/xc_linux.c @@ -186,7 +186,7 @@ void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot, * IOCTL_PRIVCMD_MMAPBATCH_V2 is not supported - fall back to * IOCTL_PRIVCMD_MMAPBATCH. */ - xen_pfn_t *pfn = calloc(num, sizeof(*pfn)); + xen_pfn_t *pfn = malloc(num * sizeof(*pfn)); if ( pfn ) { diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c index 44039b03be..04da3d2a3f 100644 --- a/tools/libxc/xc_misc.c +++ b/tools/libxc/xc_misc.c @@ -360,7 +360,7 @@ void *xc_map_foreign_pages(int xc_handle, uint32_t dom, int prot, return NULL; } - err = calloc(num, sizeof(*err)); + err = malloc(num * sizeof(*err)); if (!err) return NULL; @@ -397,7 +397,7 @@ xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot, return NULL; } - pfn = calloc(num, sizeof(*pfn)); + pfn = malloc(num * sizeof(*pfn)); if (!pfn) { errno = ENOMEM; return NULL; @@ -416,7 +416,8 @@ xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot, err[i] = -EINVAL; break; } - } + } else + memset(err, 0, num * sizeof(*err)); free(pfn); -- 2.30.2